home *** CD-ROM | disk | FTP | other *** search
/ Apple Reference & Presen…rary 8 (Internal Edition) / Apple R&P Lib Internal v8.0.iso / 3-Presentations / Markets / K-12 Education / HyperCard in Education / HyperTree / stack.txt < prev   
Text File  |  1990-04-02  |  15KB  |  532 lines

  1. -- stack: in
  2. -- format: 8 (HyperCard 1)
  3. -- flags: 0x1000 (none)
  4. -- protect password hash: 0
  5. -- maximum user level: 5 (scripting)
  6. -- window: Rect(x1=0, y1=0, x2=0, y2=0)
  7. -- screen: Rect(x1=0, y1=0, x2=0, y2=0)
  8. -- card dimensions: w=0 h=0
  9. -- scroll: x=0 y=0
  10. -- background count: 1
  11. -- first background id: 2574
  12. -- card count: 2
  13. -- first card id: 3233
  14. -- list block id: 3468
  15. -- print block id: 0
  16. -- font table block id: 0
  17. -- style table block id: 0
  18. -- free block count: 0
  19. -- free size: 0 bytes
  20. -- total size: 19744 bytes
  21. -- stack block size: 13312 bytes
  22. -- created by hypercard version: 0x00000000
  23. -- compacted by hypercard version: 0x01228000
  24. -- modified by hypercard version: 0x01228000
  25. -- opened by hypercard version: 0x01228000
  26. -- patterns[0]: 0x0000000000000000
  27. -- patterns[1]: 0x8000000008000000
  28. -- patterns[2]: 0x8800220088002200
  29. -- patterns[3]: 0x8888222288882222
  30. -- patterns[4]: 0x88AA22AA88AA22AA
  31. -- patterns[5]: 0xCCAA33AACCAA33AA
  32. -- patterns[6]: 0xEEAABBAAEEAABBAA
  33. -- patterns[7]: 0xEEBBBBEEEEBBBBEE
  34. -- patterns[8]: 0xFFBBFFEEFFBBFFEE
  35. -- patterns[9]: 0xFFBBFFFFFFBBFFFF
  36. -- patterns[10]: 0x8010022001084004
  37. -- patterns[11]: 0xFFFFFFFFFFFFFFFF
  38. -- patterns[12]: 0x8822882288228822
  39. -- patterns[13]: 0x1122448811224488
  40. -- patterns[14]: 0xC4800C6843023026
  41. -- patterns[15]: 0xB130031BD8C00C8D
  42. -- patterns[16]: 0xAA00AA00AA00AA00
  43. -- patterns[17]: 0x8822552288225522
  44. -- patterns[18]: 0x8855225588552255
  45. -- patterns[19]: 0x77DD77DD77DD77DD
  46. -- patterns[20]: 0x8000000000000000
  47. -- patterns[21]: 0xAA55AA55AA55AA55
  48. -- patterns[22]: 0x038448300C020101
  49. -- patterns[23]: 0x8244394482010101
  50. -- patterns[24]: 0x8814224188412214
  51. -- patterns[25]: 0x8080413E080814E3
  52. -- patterns[26]: 0x22048C7422179810
  53. -- patterns[27]: 0xBE808808EB088880
  54. -- patterns[28]: 0x25C8328964244C92
  55. -- patterns[29]: 0xA29C41BE2AC914EB
  56. -- patterns[30]: 0x40A00000040A0000
  57. -- patterns[31]: 0x8040200002040800
  58. -- patterns[32]: 0xAA00800088008000
  59. -- patterns[33]: 0xFF80808080808080
  60. -- patterns[34]: 0x081C22C180010204
  61. -- patterns[35]: 0xFF808080FF080808
  62. -- patterns[36]: 0xF87422478F172271
  63. -- patterns[37]: 0xBF00BFBFB0B0B0B0
  64. -- patterns[38]: 0xFF7FBE5DA2418000
  65. -- patterns[39]: 0xFAF5FAF5A050A050
  66. -- checksum: 0x0
  67. ----- HyperTalk script -----
  68. on domenu menu                       --// Added by Medior, Inc. 2/20/90
  69.   global RPStackName
  70.   if menu is in "Home,Quit HyperCard" and RPStackName is not empty then
  71.     set cursor to watch
  72.     put RPStackName into shortname
  73.     repeat until offset(":",shortname) = 0
  74.       delete char 1 to offset(":",shortname) of shortname
  75.     end repeat
  76.     delete last char of shortname
  77.     answer "This will return to "&shortname&"." with "Cancel" or "OK"
  78.     if it is "Cancel" then exit domenu
  79.     set cursor to watch
  80.     lock screen
  81.     go RPStackName
  82.     unlock screen with dissolve
  83.     exit domenu
  84.   else pass doMenu
  85. end domenu
  86.  
  87. on openStack
  88.   defineStruct
  89.   set the lineSize to 1
  90.   set the pattern to 1
  91.   show message at 22,300
  92. end openStack
  93.  
  94. on closeStack
  95.   put empty into message
  96.   set the pattern to 12
  97. end closeStack
  98.  
  99. on openCard
  100.   global rootNode, searchPath, pathLength
  101.   if the number of card fields > 0 then
  102.     put the id of card field 1 into rootNode
  103.   else
  104.     put 0 into rootNode
  105.   end if
  106.   put empty into searchPath
  107.   put 0 into pathLength
  108.   walkTree
  109. end openCard
  110.  
  111. on deleteCard
  112.   global searchPath, pathLength
  113.   put empty into searchPath
  114.   put 0 into pathLength
  115. end deleteCard
  116.  
  117. on closeCard
  118.   undoPlot
  119.   put empty into field treeList
  120. end closeCard
  121.  
  122. on defineStruct
  123.   global rootRect, rootLoc, hSpacing, vSpacing, rootLevel
  124.   put "241,148,271,163" into rootRect
  125.   put "256,155" into rootLoc
  126.   put "16,32,64,128" into hSpacing
  127.   put "30,30,30,30" into vSpacing
  128.   put 4 into rootLevel
  129. end defineStruct
  130.  
  131. on eraseTree
  132.   global rootNode, seachPath, pathLength
  133.   choose select tool
  134.   drag from 0,0 to 512,342
  135.   doMenu "Clear Picture"
  136.   choose field tool
  137.   repeat with i = the number of card fields down to 1
  138.     click at the loc of card field i
  139.     doMenu "Clear Field"
  140.   end repeat
  141.   put 0 into rootNode
  142.   put empty into searchPath
  143.   put 0 into pathLength
  144.   choose browse tool
  145. end eraseTree
  146.  
  147. on initPlot targetNode
  148.   global searchPath, pathLength
  149.   undoPlot
  150.   put targetNode into line 1 of searchPath
  151.   put the loc of card field id targetNode into line 2 of searchPath
  152.   put 2 into pathLength
  153.   set the style of card field id targetNode to shadow
  154.   set the lineSize to 2
  155.   choose line tool
  156. end initPlot
  157.  
  158. on termPlot
  159.   set the lineSize to 1
  160.   choose browse tool
  161. end termPlot
  162.  
  163. on pathPlot targetNode
  164.   global searchPath, pathLength
  165.   if targetNode ‚↠0 then
  166.     add 1 to pathLength
  167.     put targetNode into line pathLength of searchPath
  168.     add 1 to pathLength
  169.     put the loc of card field id targetNode into line pathLength of searchPath
  170.     set the style of card field id targetNode to shadow
  171.     drag from line pathLength - 2 of searchPath to line pathLength of searchPath
  172.   end if
  173. end pathPlot
  174.  
  175. on undoPlot
  176.   global searchPath, pathLength
  177.   if pathLength > 0 then
  178.     choose line tool
  179.     put line 1 of searchPath into targetNode
  180.     set the style of card field id targetNode to rectangle
  181.     put line 2 of searchPath into parentLoc
  182.     put 3 into pathIndex
  183.     repeat while pathIndex < pathLength
  184.       put line pathIndex of searchPath into targetNode
  185.       add 1 to pathIndex
  186.       get line pathIndex of searchPath
  187.       add 1 to pathIndex
  188.       set the style of card field id targetNode to rectangle
  189.       set the lineSize to 2
  190.       drag from parentLoc to it with optionKey
  191.       set the lineSize to 1
  192.       drag from parentLoc to it
  193.       put it into parentLoc
  194.     end repeat
  195.     put empty into searchPath
  196.     put 0 into pathLength
  197.     choose browse tool
  198.   end if
  199. end undoPlot
  200.  
  201. function searchTree key
  202. global rootNode, rootLevel
  203. global parentSide, parentNode, parentLevel, targetNode
  204. put 0 into parentSide
  205. put 0 into parentNode
  206. put rootLevel + 1 into parentLevel
  207. if rootNode = 0 then
  208.   put 0 into targetNode
  209.   return "missing"
  210. else
  211.   initPlot rootNode
  212.   if key = line 1 of card field id rootNode then
  213.     put rootNode into targetNode
  214.     return "found"
  215.   end if
  216. end if
  217. put rootNode into parentNode
  218. put rootLevel into parentLevel
  219. put 0 into targetNode
  220. repeat while true
  221.   get line 1 of card field id parentNode
  222.   if key < it then
  223.     put 2 into parentSide
  224.     get line 2 of card field id parentNode
  225.     if it ‚↠0 then
  226.       pathPlot it
  227.       if key = line 1 of card field id it then
  228.         put it into targetNode
  229.         return "found"
  230.       else
  231.         put it into parentNode
  232.         subtract 1 from parentLevel
  233.       end if
  234.     else
  235.       return "missing"
  236.     end if
  237.   else
  238.     if key > it then
  239.       put 3 into parentSide
  240.       get line 3 of card field id parentNode
  241.       if it ‚↠0 then
  242.         pathPlot it
  243.         if key = line 1 of card field id it then
  244.           put it into targetNode
  245.           return "found"
  246.         else
  247.           put it into parentNode
  248.           subtract 1 from parentLevel
  249.         end if
  250.       else
  251.         return "missing"
  252.       end if
  253.     end if
  254.   end if
  255. end repeat
  256. end searchTree
  257.  
  258. function newNode nodeLoc
  259. global rootRect
  260. choose field tool
  261. doMenu "New Field"
  262. get the number of card fields
  263. get the id of card field it
  264. set the rect of card field id it to rootRect
  265. set the loc of card field id it to nodeLoc
  266. set the style of card field id it to rectangle
  267. set the textFont of card field id it to geneva
  268. set the textSize of card field id it to 9
  269. set the textAlign of card field id it to center
  270. set the lockText of card field id it to true
  271. put 0 into line 2 of card field id it
  272. put 0 into line 3 of card field id it
  273. return it
  274. end newNode
  275.  
  276. function getNodeLoc parentSide, parentNode, parentLevel
  277. global rootLoc, hSpacing, vSpacing
  278. if parentNode = 0 then
  279.   return rootLoc
  280. else
  281.   put the loc of card field id parentNode into nodeLoc
  282.   get item parentLevel of vSpacing
  283.   add it to item 2 of nodeLoc
  284.   get item parentLevel of hSpacing
  285.   if parentSide = 2 then
  286.     subtract it from item 1 of nodeLoc
  287.   else
  288.     add it to item 1 of nodeLoc
  289.   end if
  290.   return nodeLoc
  291. end if
  292. end getNodeLoc
  293.  
  294. function makeNode parentSide, parentNode, parentLevel
  295. global rootLoc
  296. if parentNode = 0 then
  297.   get newNode( rootLoc )
  298.   initPlot it
  299.   return it
  300. else
  301.   put getNodeLoc( parentSide, parentNode, parentLevel ) into nodeLoc
  302.   get newNode( nodeLoc )
  303.   put it into line parentSide of card field id parentNode
  304.   choose line tool
  305.   pathPlot it
  306.   return it
  307. end if
  308. end makeNode
  309.  
  310. function insertNode key
  311. global rootNode, parentSide, parentNode, parentLevel
  312. get searchTree( key )
  313. if it = "found" then
  314.   termPlot
  315.   return "duplicate"
  316. end if
  317. if parentLevel = 0 then
  318.   termPlot
  319.   return "full"
  320. end if
  321. put makeNode( parentSide, parentNode, parentLevel ) into theNode
  322. put key into line 1 of card field id theNode
  323. if parentNode = 0 then put theNode into rootNode
  324. termPlot
  325. return "inserted"
  326. end insertNode
  327.  
  328. on moveSubTree parentSide, parentNode, parentLevel, nextNode
  329.   if nextNode ‚↠0 then
  330.     put the loc of card field id nextNode into oldLoc
  331.     put getNodeLoc( parentSide, parentNode, parentLevel ) into newLoc
  332.     set the loc of card field id nextNode to newLoc
  333.     get line 2 of card field id nextNode
  334.     if it ‚↠0 then
  335.       drag from oldLoc to the loc of card field id it with optionKey
  336.       moveSubTree 2, nextNode, parentLevel - 1, it
  337.     end if
  338.     get line 3 of card field id nextNode
  339.     if it ‚↠0 then
  340.       drag from oldLoc to the loc of card field id it with optionKey
  341.       moveSubTree 3, nextNode, parentLevel - 1, it
  342.     end if
  343.     if parentNode ‚↠0 then
  344.       drag from the loc of card field id parentNode to newLoc
  345.     end if
  346.   end if
  347. end moveSubTree
  348.  
  349. function removeNode parentSide, parentNode, parentLevel, targetNode
  350. global rootNode
  351. put line 1 of card field id targetNode into key
  352. if line 2 of card field id targetNode = 0 then
  353.   put line 3 of card field id targetNode into nextNode
  354. else
  355.   put line 2 of card field id targetNode into nextNode
  356. end if
  357. choose line tool
  358. if parentNode ‚↠0 then
  359.   drag from the loc of card field id parentNode to the loc of card field id targetNode with optionKey
  360.   set the lineSize to 1
  361. end if
  362. if nextNode ‚↠0 then
  363.   drag from the loc of card field id targetNode to the loc of card field id nextNode with optionKey
  364. end if
  365. choose field tool
  366. click at the loc of card field id targetNode
  367. doMenu "Clear Field"
  368. if parentNode ‚↠0 then
  369.   put nextNode into line parentSide of card field id parentNode
  370. end if
  371. if targetNode = rootNode then put nextNode into rootNode
  372. choose line tool
  373. moveSubTree parentSide, parentNode, parentLevel, nextNode
  374. return key
  375. end removeNode
  376.  
  377. on findNext
  378.   global parentSide, parentNode, parentLevel, targetNode
  379.   put "Looking for the successor to node" && line 1 of card field id targetNode into message
  380.   put 3 into parentSide
  381.   put targetNode into parentNode
  382.   subtract 1 from parentLevel
  383.   put line 3 of card field id parentNode into targetNode
  384.   pathPlot targetNode
  385.   get line 2 of card field id targetNode
  386.   repeat while it ‚↠0
  387.     put 2 into parentSide
  388.     put targetNode into parentNode
  389.     subtract 1 from parentLevel
  390.     put it into targetNode
  391.     pathPlot it
  392.     get line 2 of card field id targetNode
  393.   end repeat
  394. end findNext
  395.  
  396. function deleteNode key
  397. global parentSide, parentNode, parentLevel, targetNode, pathLength
  398. get searchTree( key )
  399. if it = "missing" then
  400.   termPlot
  401.   return it
  402. end if
  403. if line 2 of card field id targetNode = 0 or line 3 of card field id targetNode = 0 then
  404.   get removeNode( parentSide, parentNode, parentLevel, targetNode )
  405. else
  406.   put targetNode into oldTargetNode
  407.   findNext
  408.   get removeNode( parentSide, parentNode, parentLevel, targetNode )
  409.   put it into line 1 of card field id oldTargetNode
  410. end if
  411. subtract 2 from pathLength
  412. termPlot
  413. return "deleted"
  414. end deleteNode
  415.  
  416. on traverseTree theNode
  417.   global listLine
  418.   if theNode ‚↠0 then
  419.     traverseTree line 2 of card field id theNode
  420.     add 1 to listLine
  421.     put line 1 of card field id theNode into line listLine of field treeList
  422.     traverseTree line 3 of card field id theNode
  423.   end if
  424. end traverseTree
  425.  
  426. on makeSubTree parentNode, parentLevel
  427.   if parentLevel > 0 then
  428.     get makeNode( 2, parentNode, parentLevel )
  429.     makeSubTree it, parentLevel - 1
  430.     get makeNode( 3, parentNode, parentLevel )
  431.     makeSubTree it, parentLevel - 1
  432.   end if
  433. end makeSubTree
  434.  
  435. on enumTree
  436.   global rootLoc, rootLevel, rootNode
  437.   put newNode( rootLoc ) into rootNode
  438.   makeSubTree rootNode, rootLevel
  439.   choose browse tool
  440. end enumTree
  441.  
  442. on newTree
  443.   eraseTree
  444.   put empty into field treeList
  445.   put "The tree is empty" into message
  446. end newTree
  447.  
  448. function sideName parentSide
  449. if parentSide = 2 then
  450.   return "left"
  451. else
  452.   return "right"
  453. end if
  454. end sideName
  455.  
  456. on findNode
  457.   global parentSide, parentNode, parentLevel, targetNode
  458.   ask "3 digit search key?"
  459.   put it into key
  460.   get searchTree( key )
  461.   termPlot
  462.   if it = "found" then
  463.     put "Node" && key && "found" into message
  464.   else
  465.     if parentNode = 0 then
  466.       put "The tree is empty" into message
  467.     else
  468.       put "Node" && key && "missing" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  469.     end if
  470.   end if
  471.   choose browse tool
  472. end findNode
  473.  
  474. on putInNode
  475.   global parentSide, parentNode, parentLevel, targetNode
  476.   ask "3 digit node key?"
  477.   put it into key
  478.   get insertNode( key )
  479.   if it = "duplicate" then
  480.     put "Node" && key && "already exists" into message
  481.   else
  482.     if it = "full" then
  483.       put "No room to insert node" && key && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  484.     else
  485.       put empty into field treeList
  486.       if parentNode = 0 then
  487.         put "Node" && key && "inserted as the root node" into message
  488.       else
  489.         put "Node" && key && "inserted" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  490.       end if
  491.     end if
  492.   end if
  493.   choose browse tool
  494. end putInNode
  495.  
  496. on takeAwayNode
  497.   global parentSide, parentNode, parentLevel, targetNode
  498.   ask "3 digit node key?"
  499.   put it into key
  500.   get deleteNode( key )
  501.   if it = "missing" then
  502.     if parentNode = 0 then
  503.       put "The tree is empty" into message
  504.     else
  505.       put "Node" && key && "missing" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  506.     end if
  507.   else
  508.     put empty into field treeList
  509.     put "Node" && key && "deleted from the tree" into message
  510.   end if
  511.   choose browse tool
  512. end takeAwayNode
  513.  
  514. on walkTree
  515.   global rootNode, listLine
  516.   undoPlot
  517.   put empty into field treeList
  518.   put 0 into listLine
  519.   traverseTree rootNode
  520.   if listLine = 0 then
  521.     put "The tree is empty" into message
  522.   else
  523.     if listLine = 1 then
  524.       put "There is only the root node in the tree" into message
  525.     else
  526.       put "There are" && listLine && "nodes in the tree" into message
  527.     end if
  528.   end if
  529. end walkTree
  530.  
  531.  
  532.